题目描述:
給定兩個二進制字符串 a
和 b
,返回它們的和(用二進制表示)。輸入為非空字符串,且只包含數字 1
和 0
。
Example:
a = "1010"
, b = "1011"
"10101"
解題思路:
這道題與上一題 66. Plus One 非常相似,但不同之處在於這次的輸入是字符串,因此需要對字符串進行逐位拆解和重組。我們可以從兩個字符串的末尾開始,逐位相加並處理進位問題。這個過程類似於手動相加十進制數字,從最低位開始逐位相加,記錄結果和進位,最終得到的就是這兩個二進制數相加後的二進制表示。
還記得 9. Palindrome Number 那道題中,我們如何處理逐位拆解數字和進位操作嗎?這道題的不同之處在於這裡處理的是二進制數字,但方法幾乎相同。在二進制中,逐位拆解數字需要使用取餘數操作,即 x % 2
,而進位操作則是將數字除以 2 後取整數部分,即 Math.floor(x / 2)
。
在 JavaScript 中,我們可以使用 parseInt
函式將輸入的字符串轉換為整數。不過需要注意的是,parseInt
函式的第二個參數應該明確指定進位方式,以避免出現不預期的結果。由於這題處理的是二進制數字,因此第二個參數應設為 2。這樣能確保字符串正確地轉換為二進制整數。
var addBinary = function(a, b) {
let result = "";
let carry = 0;
let i = a.length - 1;
let j = b.length - 1;
while (i >= 0 || j >= 0 || carry > 0) {
const digitA = i >= 0 ? parseInt(a[i], 2) : 0;
const digitB = j >= 0 ? parseInt(b[j], 2) : 0;
const sum = digitA + digitB + carry;
carry = Math.floor(sum / 2);
result = (sum % 2) + result;
i--;
j--;
}
return result;
};
時間複雜度:
O(max(n, m))
,其中n
和m
分別是字符串a
和b
的長度。我們需要遍歷較長的字符串長度。
空間複雜度:O(max(n, m))
,用於存儲結果字符串所需的空間。
總結:
總體來說,這道題目與之前的題目有許多相似之處,無論是進位處理還是逐位拆解數字,都是在不同進制下的應用。通過這題,我們鞏固了二進制運算的基礎,並複習了如何靈活應用相似方法。無論是十進制還是二進制,理解並掌握這些基本操作對學習更複雜的算法至關重要。這道題目可以歸類為「while 迴圈」。同時,LeetCode 的題目設計往往有前後關聯,建議讀者依序解題,以便藉由累積經驗應對更困難的挑戰。